<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>引用类型</title>
</head>
<body>
  
  <script>
    // 1. 引用类型，都具有对象特性，即可自由扩展属性：
    // const obj = {}
    // const arr = []
    // const fn = function () {}

    // obj.a = 1
    // arr.a = 1
    // fn.a = 1

    // console.log(obj.a) // 1
    // console.log(arr.a) // 1
    // console.log(fn.a) // 1

    // 2. 引用类型，都有一个隐式原型 __proto__ 属性，属性值是一个普通的对象：
    // const obj = {};
    // const arr = [];
    // const fn = function() {}

    // console.log('obj.__proto__', obj.__proto__);
    // console.log('arr.__proto__', arr.__proto__);
    // console.log('fn.__proto__', fn.__proto__);

    // 3. 引用类型，隐式原型 __proto__ 的属性值指向它的构造函数的显式原型 prototype 属性值：
    const obj = {};
    const arr = [];
    const fn = function() {}

    console.log(obj.__proto__ == Object.prototype )// true
    console.log(arr.__proto__ === Array.prototype )// true
    console.log(fn.__proto__ == Function.prototype) // true

    // 4. 当你试图得到一个对象的某个属性时，如果这个对象本身没有这个属性，
    // 那么它会去它的隐式原型 __proto__（也就是它的构造函数的显式原型 prototype）中寻找：
    const obj = { a:1 }
    obj.toString
    // ƒ toString() { [native code] }

  </script>
</body>
</html>